package com.sinoglobal.sinostore.adapter;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;

public abstract class RecyclingPagerAdapter extends PagerAdapter {

	static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;

	private final RecycleBin recycleBin;

	public RecyclingPagerAdapter() {

		this(new RecycleBin());

	}

	RecyclingPagerAdapter(RecycleBin recycleBin) {

		this.recycleBin = recycleBin;

		recycleBin.setViewTypeCount(getViewTypeCount());

	}

	@Override
	public void notifyDataSetChanged() {

		recycleBin.scrapActiveViews();

		super.notifyDataSetChanged();

	}

	@Override
	public final Object instantiateItem(ViewGroup container, int position) {

		int viewType = getItemViewType(position);

		View view = null;

		if (viewType != IGNORE_ITEM_VIEW_TYPE) {

			view = recycleBin.getScrapView(position, viewType);

		}

		view = getView(position, view, container);

		container.addView(view);

		return view;

	}

	@Override
	public final void destroyItem(ViewGroup container, int position,
			Object object) {

		View view = (View) object;

		container.removeView(view);

		int viewType = getItemViewType(position);

		if (viewType != IGNORE_ITEM_VIEW_TYPE) {

			recycleBin.addScrapView(view, position, viewType);

		}

	}

	@Override
	public final boolean isViewFromObject(View view, Object object) {

		return view == object;

	}

	/**
	 * 56
	 * <p>
	 * 
	 * 57 Returns the number of types of Views that will be created by
	 * 
	 * 58 {@link #getView}. Each type represents a set of views that can be
	 * 
	 * 59 converted in {@link #getView}. If the adapter always returns the same
	 * 
	 * 60 type of View for all items, this method should return 1.
	 * 
	 * 61
	 * </p>
	 * 
	 * 62
	 * <p>
	 * 
	 * 63 This method will only be called when when the adapter is set on the
	 * 
	 * 64 the {@link AdapterView}.
	 * 
	 * 65
	 * </p>
	 * 
	 * 66
	 * 
	 * 
	 * 67
	 * 
	 * @return The number of types of Views that will be created by this adapter
	 * 
	 *         68
	 */

	public int getViewTypeCount() {

		return 1;

	}

	/**
	 * 74 Get the type of View that will be created by {@link #getView} for the
	 * specified item.
	 * 
	 * 75
	 * 
	 * 
	 * 76
	 * 
	 * @param position
	 *            The position of the item within the adapter's data set whose
	 *            view type we
	 * 
	 *            77 want.
	 * 
	 *            78
	 * @return An integer representing the type of View. Two views should share
	 *         the same type if one
	 * 
	 *         79 can be converted to the other in {@link #getView}. Note:
	 *         Integers must be in the
	 * 
	 *         80 range 0 to {@link #getViewTypeCount} - 1.
	 *         {@link #IGNORE_ITEM_VIEW_TYPE} can
	 * 
	 *         81 also be returned.
	 * 
	 *         82
	 * @see #IGNORE_ITEM_VIEW_TYPE
	 * 
	 *      83
	 */

	@SuppressWarnings("UnusedParameters")
	// Argument potentially used by subclasses.
	public int getItemViewType(int position) {

		return 0;

	}

	/**
	 * 90 Get a View that displays the data at the specified position in the
	 * data set. You can either
	 * 
	 * 91 create a View manually or inflate it from an XML layout file. When the
	 * View is inflated, the
	 * 
	 * 92 parent View (GridView, ListView...) will apply default layout
	 * parameters unless you use
	 * 
	 * 93
	 * {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
	 * 
	 * 94 to specify a root view and to prevent attachment to the root.
	 * 
	 * 95
	 * 
	 * 
	 * 96
	 * 
	 * @param position
	 *            The position of the item within the adapter's data set of the
	 *            item whose view
	 * 
	 *            97 we want.
	 * 
	 *            98
	 * @param convertView
	 *            The old view to reuse, if possible. Note: You should check
	 *            that this view
	 * 
	 *            99 is non-null and of an appropriate type before using. If it
	 *            is not possible to convert
	 * 
	 *            100 this view to display the correct data, this method can
	 *            create a new view.
	 * 
	 *            101 Heterogeneous lists can specify their number of view
	 *            types, so that this View is
	 * 
	 *            102 always of the right type (see {@link #getViewTypeCount()}
	 *            and
	 * 
	 *            103 {@link #getItemViewType(int)}).
	 * 
	 *            104
	 * @param parent
	 *            The parent that this view will eventually be attached to
	 * 
	 *            105
	 * @return A View corresponding to the data at the specified position.
	 * 
	 *         106
	 */

	public abstract View getView(int position, View convertView,
			ViewGroup container);

}
